CreateUserCommandHandler.execute   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 23
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 20
dl 0
loc 23
rs 9.4
c 0
b 0
f 0
cc 2
1
import { CommandHandler } from '@nestjs/cqrs';
2
import { Inject } from '@nestjs/common';
3
import { CreateUserCommand } from './CreateUserCommand';
4
import { IUserRepository } from 'src/Domain/User/Repository/IUserRepository';
5
import { IPasswordEncoder } from 'src/Application/IPasswordEncoder';
6
import { User } from 'src/Domain/User/User.entity';
7
import { IsEmailAlreadyExist } from 'src/Domain/User/Specification/IsEmailAlreadyExist';
8
import { EmailAlreadyExistException } from 'src/Domain/User/Exception/EmailAlreadyExistException';
9
10
@CommandHandler(CreateUserCommand)
11
export class CreateUserCommandHandler {
12
  constructor(
13
    @Inject('IUserRepository')
14
    private readonly userRepository: IUserRepository,
15
    @Inject('IPasswordEncoder')
16
    private readonly passwordEncoder: IPasswordEncoder,
17
    private readonly isEmailAlreadyExist: IsEmailAlreadyExist
18
  ) {}
19
20
  public async execute(command: CreateUserCommand): Promise<string> {
21
    const { firstName, lastName, password, role } = command;
22
    const email = command.email.toLowerCase();
23
24
    if (true === (await this.isEmailAlreadyExist.isSatisfiedBy(email))) {
25
      throw new EmailAlreadyExistException();
26
    }
27
28
    const hashPassword = await this.passwordEncoder.hash(password);
29
    const apiToken = await this.passwordEncoder.hash(email + password);
30
    const user = await this.userRepository.save(
31
      new User(
32
        firstName,
33
        lastName,
34
        email,
35
        apiToken,
36
        hashPassword,
37
        role
38
      )
39
    );
40
41
    return user.getId();
42
  }
43
}
44